/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rutas;

import java.util.*;
import Rutas.Utils;
/**
 *
 * @author Zoila
 */
public class Ruta {
    private int idRuta;
    private String nombre;
    private int numIncidencias=0;//incidencias encontradas
    private int numIncOcurridas;//este numero indica la cantidad real y total de incidencias en la ruta
    /*private Paradero paraderoInicio;
    private Paradero paraderoDestino;*/
    private ArrayList<Paradero>  listaParaderos;
    
    /**
     * @return the idRuta
     */
    public Ruta(int a){
        this.listaParaderos = new ArrayList<Paradero>();
    }
    
    public Ruta generaRutaInc(Ruta ruta){
        Ruta auxRuta = ruta.copiar();
         Random rand = new Random();
         int cont = 0;
        
         idRuta= rand.nextInt(1000); // genera un id Ruta aleatorio
         nombre="Ruta"+idRuta;
         //System.out.println("Cant Paraderos Original: " + ruta.getListaParaderos().size());
         for (int i=0; i<auxRuta.getListaParaderos().size();i++){
             Paradero p = auxRuta.getListaParaderos().get(i);
             Paradero pNuevo = new Paradero();
             p.copiar(pNuevo);
             int aux = rand.nextInt(10);
             
             if((aux>=5)&&(aux<=7)){
                 //si cae entre estos numero entonces hay incidencia caso contrario sigue normal
                 int tipoIn = rand.nextInt(4);
                 /*LOS TIPOS DE INCIDENCIA SON: 
                  * IR AL PARADERO EQUIVOCADO
                  * SALTARSE UN PARADERO
                  * DIFERENTE VELOCIDAD
                  * DIFERENTE TIEMPO
                  * DIFERENTE CANTIDAD DE PASAJEROS*/
                 if(tipoIn==0){//PARADERO EQUIVOCADO
                     int auxIgual = 1;
                     char car='-';
                     while(auxIgual==1){
                        car = (char)(rand.nextInt(220)+32);
                        if(p.getIdParadero()!=car)
                            auxIgual = 0;//sale xq ya no son iguales
                     }
                     pNuevo.setIdParadero(car);
                     cont++;//se aumenta 1 incidencia
                 }
                 if(tipoIn==1){//SALTO UN PARADERO
                     if(i!=(auxRuta.getListaParaderos().size()-1)){
                        p = auxRuta.getListaParaderos().get(++i);//OBTEN EL SIGUIENTE PARADERO
                        pNuevo = new Paradero();
                        p.copiar(pNuevo);//COPIA LOS DATOS DEL NUEVO PARADERO
                        cont++;//se aumenta 1 incidencia
                     }
                 }
                 if(tipoIn==2){//DIFERENTE VELOCIDAD
                     double vAct = auxRuta.getListaParaderos().get(i).getVelPromedio();
                     int auxIgual = 1;
                     int auxVel = 0;
                     while(auxIgual==1){
                        auxVel = rand.nextInt(49)+51;
                        if(vAct!=auxVel)
                            auxIgual = 0;//sale xq ya no son iguales
                     }
                     pNuevo.setVelPromedio(auxVel);
                     cont++;//se aumenta 1 incidencia
                 }
                 if(tipoIn==3){//DIFERENTE TIEMPO
                     double tAct = auxRuta.getListaParaderos().get(i).getTiempoLlegada();
                     int auxIgual = 1;
                     int auxTemp = 0;
                     while(auxIgual==1){
                        auxTemp = rand.nextInt(29)+31;
                        if(tAct!=auxTemp)
                            auxIgual = 0;//sale xq ya no son iguales
                     }
                     pNuevo.setTiempoLlegada(auxTemp);
                     cont++;//se aumenta 1 incidencia
                 }                 
                 if(tipoIn==4){//DIFERENTE CANTIDAD DE PASAJEROS
                     double pAct = auxRuta.getListaParaderos().get(i).getPromSuben();
                     int auxIgual = 1;
                     int auxPas = 0;
                     while(auxIgual==1){
                        auxPas = rand.nextInt(49)+11;
                        if(pAct!=auxPas)
                            auxIgual = 0;//sale xq ya no son iguales
                     }
                     pNuevo.setPromSuben(auxPas);
                     cont++;//se aumenta 1 incidencia
                 }
             
             }
             listaParaderos.add(pNuevo);
         }
         //System.out.println("Cant Paraderos: " + listaParaderos.size());
         auxRuta.setListaParaderos(listaParaderos);
         System.out.println(/*"Bus:" + ruta.getNombre() + */"Cont = " + cont);
         auxRuta.setNumIncOcurridas(cont);
         return auxRuta;
    }
    
    public Ruta (){ // solo se usa en las rutas iniciales
        this.listaParaderos = new ArrayList<Paradero>();
         Random rand = new Random();
        
         idRuta= rand.nextInt(1000); // genera un id Ruta aleatorio
         nombre="ruta"+idRuta;
         for (int i=0;i<Utils.MAXPARADEROS;i++){
            boolean existe=true;
            char id='a';
            while(existe){
                id = (char)(rand.nextInt(220)+32);
                for (int j=0;j<listaParaderos.size();j++){
                    if (listaParaderos.get(j).getIdParadero()==id){
                        break;
                    }
                }
                existe=false;
            }
            float velocidad= (Math.round((rand.nextFloat()*50+40)*100))/100;
            Paradero p = new Paradero (id);
            p.setVelPromedio(velocidad);
            listaParaderos.add(p);
        }
         
    }
    
    public Ruta copiar(){
        Ruta aux = new Ruta(1);
        aux.setIdRuta(this.idRuta);
        aux.setNombre(nombre);
        aux.setNumIncidencias(numIncidencias);
        aux.setNumIncOcurridas(this.numIncOcurridas);
        aux.listaParaderos = new ArrayList<Paradero>();
        for(int i=0; i<this.listaParaderos.size();i++){
            aux.listaParaderos.add(this.listaParaderos.get(i));
        }    
        return aux;
    }
    
    public int getIdRuta() {
        return idRuta;
    }

    /**
     * @param idRuta the idRuta to set
     */
    public void setNumIncOcurridas(int a){
        this.numIncOcurridas = a;
    }
    
    public int getNumIncOcurridas(){
        return this.numIncOcurridas;
    }
    
    public void setIdRuta(int idRuta) {
        this.idRuta = idRuta;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the numIncidencias
     */
    public int getNumIncidencias() {
        return numIncidencias;
    }

    /**
     * @param numIncidencias the numIncidencias to set
     */
    public void setNumIncidencias(int numIncidencias) {
        this.numIncidencias = numIncidencias;
    }

    /**
     * @return the listaParaderos
     */
    public ArrayList<Paradero> getListaParaderos() {
        return listaParaderos;
    }

    /**
     * @param listaParaderos the listaParaderos to set
     */
    public void setListaParaderos(ArrayList<Paradero> listaParaderos) {
        this.listaParaderos = listaParaderos;
    }


}
